home *** CD-ROM | disk | FTP | other *** search
/ Celestin Apprentice 7 / Apprentice-Release7.iso / Source Code / Pascal / Snippets / PNL Libraries / MyBufferedIO.p < prev    next >
Encoding:
Text File  |  1996-06-01  |  8.6 KB  |  330 lines  |  [TEXT/CWIE]

  1. unit MyBufferedIO;
  2.  
  3. interface
  4.  
  5.     uses
  6.         Types;
  7.     
  8.     type
  9.         BufferedWriteRecord = record
  10.             size: longint;
  11.             inbuf: longint;
  12.             refnum: integer;
  13.             data: longint;
  14.         end;
  15.         BufferedWriteRecordPtr = ^BufferedWriteRecord;
  16.         
  17.     type
  18.         BufferedReadRecord = record
  19.                 size: longint;
  20.                 inbuf: longint;
  21.                 buf_pos: longint;
  22.                 refnum: integer;
  23.                 file_length: longint;
  24.                 eof: Boolean;
  25.                 data: longint;
  26.             end;
  27.         BufferedReadRecordPtr = ^BufferedReadRecord;
  28.         
  29.         
  30.     function BufferedWriteCreate(var brp: BufferedWriteRecordPtr; refnum: integer; size: longint): OSErr;
  31.     function BufferedWriteDestroy(var brp: BufferedWriteRecordPtr): OSErr;
  32.     function BufferedWriteFlush(brp: BufferedWriteRecordPtr): OSErr;
  33.     function BufferedWrite(brp: BufferedWriteRecordPtr; data: Ptr; len: longint): OSErr;
  34.     function BufferedWriteSeek (brp: BufferedWriteRecordPtr; posMode: integer; seek: longint): OSErr;
  35.     function BufferedWriteGetFPos (brp: BufferedWriteRecordPtr; var seek: longint): OSErr;
  36.     
  37.     function BufferedReadCreate (var brp: BufferedReadRecordPtr; refnum: integer; size: longint): OSErr;
  38.     function BufferedReadDestroy(var brp: BufferedReadRecordPtr): OSErr;
  39.     function BufferedRead (brp: BufferedReadRecordPtr; data: Ptr; var size: longint): OSErr;
  40.     function BufferedReadStrict (brp: BufferedReadRecordPtr; data: Ptr; size: longint): OSErr;
  41.     function BufferedReadSeek (brp: BufferedReadRecordPtr; posMode: integer; seek: longint): OSErr;
  42.     function BufferedReadGetFPos (brp: BufferedReadRecordPtr; var seek: longint): OSErr;
  43.  
  44. implementation
  45.  
  46.     uses
  47.         Files, Errors, 
  48.         MyMemory, MyMathUtils, QLowLevel, MyAssertions;
  49.  
  50. {$SETC buffer := 1 }
  51.  
  52.     function BufferedWriteCreate(var brp: BufferedWriteRecordPtr; refnum: integer; size: longint): OSErr;
  53.         var
  54.             err: OSErr;
  55.     begin
  56.         if size < 1000 then begin
  57.             size := 1000;
  58.         end;
  59.         err := MNewPtr(brp, size);
  60.         if err = noErr then begin
  61.             brp^.size := size - SizeOf(BufferedWriteRecord);
  62.             brp^.inbuf := 0;
  63.             brp^.refnum := refnum;
  64.         end;
  65.         BufferedWriteCreate := err;
  66.     end;
  67.     
  68.     function BufferedWriteDestroy(var brp: BufferedWriteRecordPtr): OSErr;
  69.         var
  70.             err: OSErr;
  71.     begin
  72.         err := BufferedWriteFlush(brp);
  73.         MDisposePtr(brp);
  74.         BufferedWriteDestroy := err;
  75.     end;
  76.     
  77.     function BufferedWriteFlush(brp: BufferedWriteRecordPtr): OSErr;
  78.         var
  79.             err: OSErr;
  80.     begin
  81.         err := noErr;
  82.         if brp^.inbuf > 0 then begin
  83.             err := FSWrite(brp^.refnum, brp^.inbuf, @brp^.data);
  84.             brp^.inbuf := 0;
  85.         end;
  86.         BufferedWriteFlush := err;
  87.     end;
  88.     
  89.     function BufferedWrite(brp: BufferedWriteRecordPtr; data: Ptr; len: longint): OSErr;
  90.         var
  91.             err: OSErr;
  92.     begin
  93.         err := noErr;
  94.         if brp^.inbuf + len >= brp^.size then begin
  95.             err := BufferedWriteFlush(brp);
  96.             if (err = noErr) & (len >= brp^.size) then begin
  97.                 err := FSWrite(brp^.refnum, len, data);
  98.                 len := 0;
  99.             end;
  100.         end;
  101.         if (err = noErr) & (len > 0) then begin
  102.             BlockMoveData(data, AddPtrLong(@brp^.data, brp^.inbuf), len);
  103.             brp^.inbuf := brp^.inbuf + len;
  104.         end;
  105.         BufferedWrite := err;
  106.     end;
  107.     
  108.     function BufferedWriteSeek (brp: BufferedWriteRecordPtr; posMode: integer; seek: longint): OSErr;
  109.         var
  110.             err: OSErr;
  111.     begin
  112.         err := BufferedWriteFlush(brp);
  113.         if err = noErr then begin
  114.             err := SetFPos(brp^.refnum, posMode, seek);
  115.         end;
  116.         BufferedWriteSeek := err;
  117.     end;
  118.     
  119.     function BufferedWriteGetFPos (brp: BufferedWriteRecordPtr; var seek: longint): OSErr;
  120.         var
  121.             err: OSErr;
  122.     begin
  123.         err := GetFPos(brp^.refnum, seek);
  124.         seek := seek + brp^.inbuf;
  125.         BufferedWriteGetFPos := err;
  126.     end;
  127.     
  128.     function BufferedReadCreate (var brp: BufferedReadRecordPtr; refnum: integer; size: longint): OSErr;
  129.         var
  130.             err: OSErr;
  131.             flen: longint;
  132.     begin
  133.         err := GetEOF(refnum, flen);
  134.         if err = noErr then begin
  135.             if size < 1000 then begin
  136.                 size := 1000;
  137.             end;
  138.             err := MNewPtr(brp, size);
  139.             if err = noErr then begin
  140.                 brp^.size := size - SizeOf(BufferedReadRecord);
  141.                 brp^.inbuf := 0;
  142.                 brp^.refnum := refnum;
  143.                 brp^.file_length := flen;
  144.                 brp^.buf_pos := 0;
  145.                 brp^.eof := false;
  146.             end;
  147.         end;
  148.         BufferedReadCreate := err;
  149.     end;
  150.     
  151.     function BufferedReadDestroy(var brp: BufferedReadRecordPtr): OSErr;
  152.     begin
  153.         MDisposePtr(brp);
  154.         BufferedReadDestroy := noErr;
  155.     end;
  156.     
  157.     function FillBuffer(brp: BufferedReadRecordPtr): OSErr;
  158.         var
  159.             err: OSErr;
  160.             count: longint;
  161.     begin
  162.         err := noErr;
  163.         if brp^.buf_pos < brp^.inbuf then begin
  164.             BlockMoveData(AddPtrLong(@brp^.data, brp^.buf_pos), @brp^.data, brp^.inbuf - brp^.buf_pos);
  165.             brp^.inbuf := brp^.inbuf - brp^.buf_pos;
  166.         end else begin
  167.             brp^.inbuf := 0;
  168.         end;
  169.         brp^.buf_pos := 0;
  170.         if not brp^.eof and (brp^.inbuf < brp^.size) then begin
  171.             count := brp^.size - brp^.inbuf;
  172.             err := FSRead(brp^.refnum, count, AddPtrLong(@brp^.data, brp^.inbuf));
  173.             brp^.eof := err = eofErr;
  174.             if err = eofErr then begin
  175.                 err := noErr;
  176.             end;
  177.             brp^.inbuf := brp^.inbuf + count;
  178.         end;
  179.         FillBuffer := err;
  180.     end;
  181.  
  182.     function BufferedRead (brp: BufferedReadRecordPtr; data: Ptr; var size: longint): OSErr;
  183.         var
  184.             err: OSErr;
  185.             count, retsize, inbuffer: longint;
  186.     begin
  187. {$IFC buffer}
  188.         err := noErr;
  189.         retsize := 0;
  190.         while (retsize < size) & (err = noErr) do begin
  191.             count := brp^.inbuf - brp^.buf_pos;
  192.             if count > 0 then begin
  193.                 inbuffer := Min(size - retsize, count);
  194.                 BlockMoveData(AddPtrLong(@brp^.data, brp^.buf_pos), AddPtrLong(data, retsize), inbuffer);
  195.                 retsize := retsize + inbuffer;
  196.                 brp^.buf_pos := brp^.buf_pos + inbuffer;
  197.             end;
  198.             if retsize < size then begin
  199.                 Assert(brp^.inbuf = brp^.buf_pos);
  200.                 if not brp^.eof then begin
  201.                     if size - retsize > brp^.size then begin
  202.                         count := size - retsize;
  203.                         err := FSRead(brp^.refnum, count, AddPtrLong(data, retsize));
  204.                         brp^.eof := err = eofErr;
  205.                         if err = eofErr then begin
  206.                             err := noErr;
  207.                         end;
  208.                         retsize := retsize + count;
  209.                         leave;
  210.                     end else begin
  211.                         err := FillBuffer(brp);
  212.                         if brp^.inbuf = 0 then begin
  213.                             leave;
  214.                         end;
  215.                     end;
  216.                 end else begin
  217.                     leave;
  218.                 end;
  219.             end;
  220.         end;
  221.         if (err = noErr) & (size > 0) & (retsize = 0) then begin
  222.             err := eofErr;
  223.         end;
  224.         size := retsize;
  225. {$ELSEC}
  226.         err := FSRead(brp^.refnum, size, data);
  227. {$ENDC}
  228.         BufferedRead := err;
  229.     end;
  230.     
  231.     function BufferedReadStrict (brp: BufferedReadRecordPtr; data: Ptr; size: longint): OSErr;
  232.         var
  233.             err: OSErr;
  234.             oldsize: longint;
  235.     begin
  236.         oldsize := size;
  237.         err := BufferedRead(brp, data, size);
  238.         if (err = noErr) & (oldsize <> size) then begin
  239.             err := eofErr;
  240.         end;
  241.         BufferedReadStrict := err;
  242.     end;
  243.     
  244.     function BufferedReadSeek (brp: BufferedReadRecordPtr; posMode: integer; seek: longint): OSErr;
  245.         var
  246.             err: OSErr;
  247.     begin
  248. {$IFC buffer}
  249.         if (posMode = fsFromMark) then begin
  250.             if (-brp^.buf_pos <= seek) & (seek <= (brp^.inbuf - brp^.buf_pos)) then begin
  251.                 brp^.buf_pos := brp^.buf_pos + seek;
  252.                 err := noErr;
  253.             end else begin
  254.                 err := SetFPos(brp^.refnum, posMode, seek - (brp^.inbuf - brp^.buf_pos) );
  255.                 brp^.inbuf := 0;
  256.                 brp^.buf_pos := 0;
  257.                 brp^.eof := false;
  258.             end;
  259.         end else begin
  260.             err := SetFPos(brp^.refnum, posMode, seek);
  261.             brp^.inbuf := 0;
  262.             brp^.buf_pos := 0;
  263.             brp^.eof := false;
  264.         end;
  265. {$ELSEC}
  266.         err := SetFPos(brp^.refnum, posMode, seek);
  267. {$ENDC}
  268.         BufferedReadSeek := err;
  269.     end;
  270.     
  271.     function BufferedReadGetFPos (brp: BufferedReadRecordPtr; var seek: longint): OSErr;
  272.         var
  273.             err: OSErr;
  274.     begin
  275.         err := GetFPos(brp^.refnum, seek);
  276. {$IFC buffer}
  277.         seek := seek - (brp^.inbuf - brp^.buf_pos);
  278. {$ENDC}
  279.         BufferedReadGetFPos := err;
  280.     end;
  281.     
  282. end.
  283.  
  284.     var
  285.         err, junk: OSErr;
  286.         src, dst: FSSpec;
  287.         srn, drn: integer;
  288.         srcbrp: BufferedReadRecordPtr;
  289.         dstbrp: BufferedWriteRecordPtr;
  290.         buffer: packed array[1..10000] of Byte;
  291.         count: longint;
  292. begin
  293.     junk := FSMakeFSSpec(0, 0, 'Zany:WordCounts.hqx', src);
  294.     junk := FSMakeFSSpec(0, 0, 'Zany:OutputFile', dst);
  295.     junk := FSpDelete(dst);
  296.     junk := FSpCreate(dst, '????', 'TEXT', 0);
  297.     err := FSpOpenDF(src, fsRdPerm, srn);
  298.     writeln('FSpOpenDF ', err);
  299.     if err = noErr then begin
  300.         err := BufferedReadCreate(srcbrp, srn, 8000);
  301.         writeln('BufferedReadCreate ', err);
  302.         if err = noErr then begin
  303.             err := FSpOpenDF(dst, fsWrPerm, drn);
  304.             writeln('FSpOpenDF ', err);
  305.             if err = noErr then begin
  306.                 err := BufferedWriteCreate(dstbrp, drn, 8000);
  307.                 writeln('BufferedWriteCreate ', err);
  308.                 if err = noErr then begin
  309.                     while err = noErr do begin
  310.                         count := SizeOf(buffer);
  311.                         err := BufferedRead(srcbrp, @buffer, count);
  312.                         if err = noErr then begin
  313.                             err := BufferedWrite(dstbrp, @buffer, count);
  314.                         end;
  315.                     end;
  316.                     writeln(err);
  317.                     err := BufferedWriteDestroy(dstbrp);
  318.                     writeln('BufferedWriteDestroy ', err);
  319.                 end;
  320.                 err := FSClose(drn);
  321.                 writeln('FSClose ', err);
  322.             end;
  323.             err := BufferedReadDestroy(srcbrp);
  324.             writeln('BufferedReadDestroy ', err);
  325.         end;
  326.         junk := FSClose(srn);
  327.         writeln('FSClose ', err);
  328.     end;
  329. end.
  330.